'use strict';

module.exports = {
  base64Encode(str = '') {
    return new Buffer(str).toString('base64');
  },
  unPick(source, arr) {
    if (Array.isArray(arr)) {
      const obj = {};
      for (const i in source) {
        if (!arr.includes(i)) {
          obj[i] = source[i];
        }
      }
      return obj;
    }
  },
  // 将表结构转换成树结构
  convert(temp) {
    const list = JSON.parse(JSON.stringify(temp));
    const res = [];
    // 生成表结构中所有id的集合
    const map = list.reduce((res, v) => {
      res[v.id] = v;
      return res;
    }, {});
    for (const item of list) {
      // 如果是根节点 则直接加入返回值
      if (item.parentId === 0 || item.parentId == null) {
        res.push(item);
        continue;
      }
      // 如果不是根节点 则一定有parentId 那在id的结合中找到所对应的值 将数据推入父级id的children中
      if (item.parentId in map) {
        const parent = map[item.parentId];
        parent.children = parent.children || [];
        parent.children.push(item);
      }
    }
    return res;
  },
  // 扁平化数据
  flat(data) {
    const temp = JSON.parse(JSON.stringify(data));
    forEachData(temp);
    return temp;
  },
  // 防止最大范围比最小范围小
  transformRange(arr) {
    if (arr[0] > arr[1]) {
      arr[1] = arr[0] + 1;
    }
    return arr;
  },
};

function forEachData(data) {
  if (data instanceof Array) {
    for (let i = 0, len = data.length; i < len; i++) {
      flatData(data[i]);
    }
  } else {
    flatData(data);
  }
}

function flatData(data) {
  for (const key of Object.keys(data)) {
    if (typeof data[key] === 'object' && data[key] != null && !(data[key] instanceof Array)) {
      flatData(data[key]);
      for (const key1 of Object.keys(data[key])) {
        data[key + key1.charAt(0).toUpperCase() + key1.slice(1)] = data[key][key1];
      }
      delete data[key];
    } else if (data[key] === null) {
      delete data[key];
    }
  }
}
